home *** CD-ROM | disk | FTP | other *** search
/ Aminet 19 / Aminet 19 (1997)(GTI - Schatztruhe)[!][Jun 1997].iso / Aminet / comm / fido / AFManager.lha / AFM / AFManager.source < prev    next >
Text File  |  1997-03-02  |  22KB  |  738 lines

  1. /*
  2.  * AREAFIX MANAGER © 1993 PSR Software, based on AreaFixMan v3.0
  3.  * $VER: AFManager 1.4 (01.03.96)
  4.  *
  5.  * PROGRAM DESRIPTION
  6.  *
  7.  *   Makes area fixing much simpler, for Spot users only.
  8.  *
  9.  * AUTHOR(S)
  10.  *
  11.  *   Original AFM v3.0 by Paul Ruane of PSR Software.
  12.  *
  13.  *        2:252/149.3  @fidonet
  14.  *        2:253/516.12 @fidonet
  15.  *        39:135/14.3  @amiganet
  16.  *        39:135/13.12 @amiganet
  17.  *
  18.  *   All modifications from AFM 3.0 by Sylvain Bourcier, Daddy B@@ze...
  19.  *
  20.  *        1:167/151.66 @fidonet
  21.  *
  22.  * DISCLAIMER
  23.  *
  24.  *   Freeware. Should not have been altered or modified without permission,
  25.  *   but... This version has not been approved for release by PSR.
  26.  *
  27.  * PROGRAM HISTORY
  28.  *
  29.  *  v1.4 -Added %QUERY to options requester.
  30.  *       -Slightly better areaname checks, but you can still screw up.
  31.  *       -Erase action will prompt instead of erasing last entry.
  32.  *       -No longer accepts same attach/detach action more than once.
  33.  *       -Added manual detach, to detach from areas that have a very low
  34.  *        mailflow and from which you might not yet have received anything.
  35.  *
  36.  *  v1.3 -Removed signature in AFM-Written messages, some areafix programs
  37.  *        choke on it - and on tearlines, very lame.
  38.  *
  39.  *  v1.2 -Added check to remove leading +/- from area names.
  40.  *       -Added check to remove leading % when entering special option.
  41.  *       -Added request to proceed IF Length(areaname)>30.
  42.  *       -Fixed deleterequest in openprefs - quotes, always one missing ;)
  43.  *       -Special %options and pswd options asked in same requester now.
  44.  *       -No longer writes a message if no attach/detach and no option.
  45.  *
  46.  *  v1.1 -Didn't Upper the right variable in PROCESSAREAFILE. Fixed.
  47.  *
  48.  *  v1.0 -Improved area selection, can be started from anywhere!
  49.  *       -Prefs requesters will contain value of last prefs entry.
  50.  *       -If prefs file is invalid, you don't have to quit and restart.
  51.  *       -Add areas from message now works!
  52.  *       -Add areas from an external file!
  53.  *       -Announce asked at time of detach.
  54.  *       -Some more crap removed, fixed or improved.
  55.  */
  56.  
  57. /*---------------------------------------------------------------------------
  58.                   You may edit the following to your likes
  59. ---------------------------------------------------------------------------*/
  60.  
  61. DETACH_SUBJECT="So Long and thanks for all the fish..."
  62. DETACH_FILE="Rexx:Spot/AFM/AFManager.announce"
  63. PREF_FILE="Areafixman.prefs"
  64. EDITOR="Rexx:StartCed.rexx"
  65. CHAR="~"
  66. CHARNAME="Tilde"
  67. CURRENTFORMAT="FORMAT 2.6"
  68. MAXACTION=20
  69.  
  70. /*---------------------------------------------------------------------------
  71.                                    SETUP
  72. ---------------------------------------------------------------------------*/
  73.  
  74. FILE="ENV:"||PREF_FILE
  75. FILESAVE="ENVARC:"||PREF_FILE
  76. TEMP="T:Spot.AFManager.temp"
  77. TEMP2="T:Spot.AFManager.temp2"
  78. LF="0d"x
  79. Tmp=0
  80. Fromnumber=0
  81. Fromarea="NONE"
  82. message=""
  83. helpmsg.=""
  84. helpitems=3
  85. helpmsg.1="Messages to AreaFix should be in your MATRIX/NETMAIL areas."||LF
  86. helpmsg.1=helpmsg.1||"If you send it in any other area, other people may see your"||LF
  87. helpmsg.1=helpmsg.1||"password and assume your identity."
  88. helpmsg.2="If you started AFM from a message, selecting MESSAGE will"||LF
  89. helpmsg.2=helpmsg.2||"bring up an editor with it's content.  You can then put the"||LF
  90. helpmsg.2=helpmsg.2||"character '"||CHARNAME||"' in front of areanames you wish to attach."||LF
  91. helpmsg.2=helpmsg.2||"The FILE option will do the same with a file of your choice."||LF||LF
  92. helpmsg.2=helpmsg.2||"¹AFM will retrieve only ONE area name per line."||LF
  93. helpmsg.2=helpmsg.2||"²Remember, you must use the REALNAMES for Areafix to work."
  94. helpmsg.3="AFM can send a predefined message in the area"||LF
  95. helpmsg.3=helpmsg.3||"you are detaching from. The current message is:"||LF
  96. helpmsg.3=helpmsg.3||DETACH_FILE
  97.  
  98. If ~show('ports','SPOT') Then Do
  99.   Say '+++ Error! You must be in SPOT to use this script.'
  100.   Exit 10
  101. End
  102.  
  103. Address SPOT
  104. OPTIONS RESULTS
  105. SIGNAL ON BREAK_C
  106. SIGNAL ON SYNTAX
  107. SIGNAL ON NOVALUE
  108. SIGNAL ON FAILURE
  109.  
  110. 'isiconified'
  111. If RC=0 Then 'uniconify'
  112.  
  113. /* Verify if prefs file exists and create one if not */
  114.  
  115. Tmp=verifyprefsfile()
  116.   If Tmp>9 Then Exit 10  /*fatal error*/
  117.   If Tmp>0 Then Exit     /*user aborted*/
  118.   Call Close('PREFS')
  119.  
  120. /*---------------------------------------------------------------------------
  121.                               GET NETMAIL AREA
  122. ---------------------------------------------------------------------------*/
  123.  
  124. 'ismessages'
  125. If RC=0 Then Do
  126.  'getnummsgs'
  127.   If RESULT>0 Then Do
  128.    'getmessagenum'
  129.     Fromnumber=RESULT
  130.    'getareaname'
  131.     Fromarea=RESULT
  132.   End
  133. End
  134.  
  135. 'isarealist'
  136. If ~(RC=0) Then 'arealist'
  137. Do Forever
  138.  'requestarea' 'TITLE "Areafix to which area?"'
  139.   If RC>0 Then Exit
  140.  'gotoarea' RESULT
  141.   If RC=0 Then Leave
  142. End
  143.  
  144. 'getareaname'
  145. REAL_NAME=RESULT
  146.  
  147. If ~(left(REAL_NAME,3)='NET') Then Do Forever
  148.  'gotomatrixarea'
  149.   If RC=0 Then Do
  150.    'getareaname'
  151.     MATRIXNAME=RESULT
  152.     MATRIXNAME2='_NET('substr(RESULT,5)')'
  153.    'gotoarea' REAL_NAME /*go back to original area*/
  154.    'requestresponse PROMPT "'REAL_NAME' is not a NETMAIL area!'LF'Do you really wish to Areafix to a public echo?" GADGETS "'MATRIXNAME2'|_Continue|_Help|_QUIT" CENTER'
  155.     If RC=0 Then Exit
  156.     If RC=1 Then Do
  157.       REAL_NAME=MATRIXNAME
  158.      'gotoarea' MATRIXNAME
  159.       Leave
  160.       End
  161.     If RC=2 Then Leave
  162.     If RC=3 Then Call help(1)
  163.     End
  164.   Else Do
  165.    'requestresponse PROMPT "'REAL_NAME' is not a NETMAIL area!'LF'Do you really wish to Areafix to a public echo?" GADGETS "_Continue|_Help|_QUIT" CENTER'
  166.     If RC=0 Then Exit
  167.     If RC=1 Then Leave
  168.     If RC=2 Then Call help(1)
  169.     End
  170. End
  171.  
  172. /*---------------------------------------------------------------------------
  173.                                  READ PREFS
  174. ---------------------------------------------------------------------------*/
  175.  
  176. /* Now we try to open the prefs file again... */
  177.  
  178. Tmp=verifyprefsfile()
  179.   If Tmp>9 Then Exit 10  /*fatal error*/
  180.   If Tmp>0 Then Exit     /*user aborted*/
  181.  
  182. /* File should be opened past the first line */
  183.  
  184. DEFAULTBOSS='1:167/151'
  185. DEFAULTPASS='yourpassword'
  186.  
  187. Do Until EOF('PREFS')
  188.  
  189.   DUMMY='dummy'
  190.   AREA=Strip(ReadLn('PREFS'),'L')
  191.   ADDRESS=Strip(ReadLn('PREFS'),'L')
  192.   PASS=Strip(ReadLn('PREFS'),'L')
  193.   AREAFIX=Strip(ReadLn('PREFS'),'L')
  194.  
  195.   If Length(PASS)>0 Then DEFAULTPASS=PASS
  196.   If Length(ADDRESS)>0 Then DEFAULTBOSS=ADDRESS
  197.  
  198.   COMMENT=Strip(ReadLn('PREFS'),'L')
  199.   If Length(COMMENT)=0 Then Do
  200.     COMMENT='Options'
  201.     End
  202.   Else Do
  203.     ANNOUNCE=Strip(ReadLn('PREFS'),'L') /*no longer necessary but left for compatibility*/
  204.     If Length(ANNOUNCE)=0 Then Do
  205.       ANNOUNCE='No Announce'
  206.       DUMMY=''
  207.       End
  208.     Else Do /* Any new prefs will be inserted here */
  209.       Do until Length(DUMMY)=0
  210.         DUMMY=ReadLn('PREFS')
  211.       End
  212.     End
  213.   End
  214.  
  215.   If AREA=REAL_NAME Then Do /*we found the area*/
  216.     Call Close('PREFS')
  217.     Signal DOAREAFIX
  218.   End
  219.  
  220. End
  221.  
  222. /*---------------------------------------------------------------------------
  223.                              ADD AREA TO PREFS
  224. ---------------------------------------------------------------------------*/
  225.  
  226. Call Close('PREFS')
  227.  
  228. 'requeststring TITLE "Boss" PROMPT "Enter the address of your boss'LF'for the area 'REAL_NAME'." DEFAULT 'DEFAULTBOSS' CENTER'
  229.  If RC>0 Then Exit
  230.  ADDRESS=RESULT
  231.  
  232. 'requeststring TITLE "Password" PROMPT "Enter your password for this boss." DEFAULT 'DEFAULTPASS' CENTER'
  233.  If RC>0 Then Exit
  234.  PASS=RESULT
  235.  
  236. 'requeststring TITLE "AreaFix" PROMPT "Enter name of the Areafix handler'LF'for this boss or leave unaltered." DEFAULT "Areafix" CENTER'
  237.  If RC>0 Then Exit
  238.  AREAFIX=RESULT
  239.  
  240. 'requeststring TITLE "Comment" PROMPT "Enter optional comment/reminder for this area." CENTER'
  241.  If RC>0 Then Exit
  242.  COMMENT=RESULT
  243.  If Length(COMMENT)=0 Then COMMENT="Options"
  244.  
  245.  ANNOUNCE='AnnounceDummy'
  246.  
  247.  /* 'requestresponse' 'TITLE "Announce" PROMPT "Do you want a message sent'LF'to areas you detach from?" GADGETS " _Yes | _No | _QUIT "'
  248.   *  If RC=0 Then Exit
  249.   *  If RC=2 Then ANNOUNCE='No Announce' */
  250.  
  251.  /* Further prefs will be added here as they are thought of */
  252.  
  253. 'requestresponse PROMPT "You have changed the prefs." GADGETS "_Save|_Use|_QUIT" CENTER'
  254.  If RC=0 Then Exit
  255.  saveit=RC
  256.  If ~Open('PREFS',FILE,'a') Then Do
  257.   'requestnotify PROMPT "FATAL ERROR!'LF'Could not re-open prefs file ('FILE')"'
  258.    Exit 10
  259.  End
  260.  Call WriteLn('PREFS',REAL_NAME)
  261.  Call WriteLn('PREFS',ADDRESS)
  262.  Call WriteLn('PREFS',PASS)
  263.  Call WriteLn('PREFS',AREAFIX)
  264.  Call WriteLn('PREFS',COMMENT)
  265.  Call WriteLn('PREFS',ANNOUNCE)
  266.  Call WriteLn('PREFS','')
  267.  Call Close('PREFS')
  268.  If saveit=1 Then Address COMMAND 'Copy 'FILE FILESAVE
  269.  
  270. /*---------------------------------------------------------------------------
  271.                                DO AREA FIXING
  272. ---------------------------------------------------------------------------*/
  273.  
  274. DOAREAFIX:
  275.  
  276. COUNT=0
  277. ENTRY.=''
  278. Address COMMAND
  279.  'Delete >NIL: 'TEMP
  280.  'Delete >NIL: 'TEMP2
  281. Address SPOT
  282.  
  283. /*---------------------------------------------------------------------------
  284.                              AREAFIX MAIN LOOP
  285. ---------------------------------------------------------------------------*/
  286.  
  287. FIXAREA:
  288.  
  289. Do Forever
  290.  
  291.   TEXT=''
  292.   AFMCommand=0
  293.  'arealist'
  294.  
  295.   If COUNT>0 Then Do c=1 To (COUNT-1)
  296.     If LENGTH(ENTRY.c)>30 Then TEXT2=Left(ENTRY.c,30)'...'
  297.       Else TEXT2=ENTRY.c
  298.     If c<10 Then TEXT=TEXT||'(0'c')   '||TEXT2||LF
  299.       Else TEXT=TEXT||'('c')   '||TEXT2||LF
  300.   End
  301.   If LENGTH(ENTRY.COUNT)>30 Then TEXT2=Left(ENTRY.COUNT,30)'...'
  302.     Else TEXT2=ENTRY.c
  303.   If COUNT<10 Then TEXT=TEXT||'(0'COUNT')   '||TEXT2
  304.     Else TEXT=TEXT||'('COUNT')   '||TEXT2
  305.  
  306.   If COUNT<MAXACTION Then Do
  307.     If COUNT>0 Then Do
  308.      'requestresponse TITLE "'COMMENT'" PROMPT "'TEXT'" GADGETS "_Attach|_Detach|_Erase Action|_Done|_Quit"'
  309.       AFMCommand=RC
  310.       End
  311.     Else Do
  312.      'requestresponse TITLE "'COMMENT'" PROMPT "(no command)" GADGETS "_Attach|_Detach|_Done|_Quit"'
  313.       AFMCommand=RC
  314.       If AFMCommand=3 Then AFMCommand=4
  315.       End
  316.     End
  317.   Else Do
  318.    'requestresponse TITLE "'COMMENT'" PROMPT "'TEXT'" GADGETS "_Erase Action|_DONE|_QUIT"'
  319.     AFMCommand=RC
  320.     If AFMCommand>0 Then AFMCommand=AFMCommand+2
  321.   End
  322.  
  323.   /*AFMCommands: 1=attach, 2=detach, 3=erase, 4=done, 0=quit*/
  324.     
  325.   Select
  326.     When AFMCommand=0 Then Exit
  327.     When AFMCommand=1 Then Call attachareas()
  328.     When AFMCommand=2 Then Call detachareas()
  329.     When AFMCommand=4 Then Call wearedone()
  330.     When AFMCommand=3 Then Call eraseaction()
  331.   End
  332.  
  333. End
  334. Exit
  335.  
  336. /*---------------------------------------------------------------------------
  337.                                  PROCEDURES
  338. ---------------------------------------------------------------------------*/
  339.  
  340.       /*-----------------------------------------------------------
  341.                                  OPEN PREFS
  342.       -----------------------------------------------------------*/
  343.  
  344. /* Verify that prefs file is alive and valid. CAREFUL, RECURSIVE!
  345.  * If RESULT=0 file stays opened and 1st line has been read.
  346.  * If RESULT=10 there is NO OPENED FILE! You should Exit.
  347.  */
  348.  
  349. verifyprefsfile: PROCEDURE EXPOSE FILE FILESAVE PREFS CURRENTFORMAT LF
  350.  
  351. If ~Open('PREFS',FILE,'r') Then Do
  352.   If ~Open('PREFS',FILE,'w') Then Do
  353.    'requestnotify TITLE "Error" PROMPT "FATAL ERROR!'LF'Could not create prefs file ('FILE')"'
  354.     Return '10'
  355.   End
  356.   Call WriteLn('PREFS','FORMAT 2.6')
  357.   Call Close('PREFS')
  358.  'requestnotify PROMPT "A new prefs file has been created."'
  359.   If ~Open('PREFS',FILE,'r') Then Do
  360.    'requestnotify TITLE "Error" PROMPT "FATAL ERROR!'LF'Could not re-open prefs file ('FILE')"'
  361.     Return '10'
  362.   End
  363. End
  364.  
  365. FORMAT=ReadLn('PREFS')
  366. If ~(FORMAT=CURRENTFORMAT) Then Do
  367.   message = 'PREFS file is not compatible with this version of AFM.'||LF
  368.   message = message||'Delete the prefs files and create a new one?'
  369.  'requestresponse TITLE "Delete?" PROMPT "'message'" GADGETS "_Delete|_QUIT" CENTER'
  370.   If RC=1 Then Do
  371.     Call Close('PREFS')
  372.     Address COMMAND
  373.       'Delete' ">NIL:" FILE
  374.       'Delete' ">NIL:" FILESAVE
  375.     Address SPOT
  376.     LocalResult=verifyprefsfile() /* Deleted file, let's create a new one */
  377.     Return LocalResult
  378.   End
  379.   Return '5'
  380. End
  381. Return '0'
  382.  
  383.       /*-----------------------------------------------------------
  384.                                 ATTACH AREAS
  385.       -----------------------------------------------------------*/
  386.  
  387. attachareas:
  388.  
  389. Do Forever
  390.  
  391.  'requestresponse TITLE "Attach Method" PROMPT "You may select areas in one of 3 ways" GADGETS "M_anually|_Message|_File|_Help|_Cancel" CENTER'
  392.   If RC=0 Then Return
  393.   ATTACHCommand=RC
  394.  
  395.   If ATTACHCommand=4 Then Call help(2)
  396.  
  397.   If ATTACHCommand=1 Then Do
  398.     Do Forever
  399.      'requeststring TITLE "Manual attach" PROMPT "Enter area name to attach,'LF'Cancel to End." CENTER'
  400.       If RC>0 Then Leave
  401.       AREANAM=RESULT
  402.       Tmp=checkareaname()
  403.       If Tmp>0 Then Leave
  404.       Dup=0
  405.       Do c=1 To COUNT
  406.         If ENTRY.c='+'AREANAM Then Dup=1
  407.       End
  408.       If Dup=0 Then Do
  409.         COUNT=COUNT+1
  410.         ENTRY.COUNT='+'||AREANAM
  411.       End
  412.       If COUNT=MAXACTION Then Return
  413.     End
  414.     Return
  415.   End
  416.  
  417.   If ATTACHCommand=2 Then Do
  418.     If Fromnumber=0 Then 'requestnotify PROMPT "You did not Call AFM from a message."'
  419.     Else Do
  420.      'gotoarea' Fromarea
  421.       If RC>0 Then Do
  422.        'requestnotify TITLE "Error" PROMPT "Unable to reach message#'Fromnumber' in area 'Fromarea'."'
  423.         Return
  424.       End
  425.      'messages'
  426.      'gotomessage' Fromnumber
  427.       If RC>0 Then Do
  428.        'requestnotify TITLE "Error" PROMPT "Unable to reach message#'Fromnumber' in area 'Fromarea'."'
  429.         Return
  430.       End
  431.      'saveascii TO "'TEMP2'" OVERWRITE NOHEADER NOTEARLINE NOORIGIN NOKLUDGES NOREFLOW'
  432.       If RC>0 Then Do
  433.        'requestnotify TITLE "Error" PROMPT "Unable to save message to 'TEMP2'"'
  434.         Return
  435.       End
  436.       Call processareafile()
  437.       Return
  438.     End
  439.   End
  440.  
  441.   If ATTACHCommand=3 Then Do
  442.    'requestfile TITLE "Select textfile"'
  443.     If RC=0 Then Do
  444.       Address COMMAND 'Copy 'RESULT TEMP2
  445.       If RC>0 Then Do
  446.        'requestnotify TITLE "Error" PROMPT "Unable to copy file to 'TEMP2'"'
  447.         Return
  448.       End
  449.       Call processareafile()
  450.       Return
  451.     End
  452.   End
  453.  
  454. End
  455. Return
  456.  
  457.       /*-----------------------------------------------------------
  458.                              PROCESS AREA FILE
  459.       -----------------------------------------------------------*/
  460.  
  461. processareafile:
  462.  
  463. 'WB2Front'
  464.  Address COMMAND '"'EDITOR'"' '"'TEMP2'"'
  465. 'Spot2Front'
  466.  If Open('ATTACHFILE',TEMP2,'r') Then Do
  467.    Do While ~EOF('ATTACHFILE') & (COUNT<MAXACTION)
  468.      ALINE=ReadLn('ATTACHFILE')
  469.      P=Pos(CHAR,ALINE)
  470.      If P>0 Then Do
  471.        ALINE=Right(ALINE,Length(ALINE)-P)
  472.        AREANAM=Word(ALINE,1)
  473.        Tmp=checkareaname()
  474.        If Tmp=0 Then Do
  475.          Dup=0
  476.          Do c=1 To COUNT
  477.            If ENTRY.c='+'AREANAM Then Dup=1
  478.          End
  479.          If Dup=0 Then Do
  480.            COUNT=COUNT+1
  481.            ENTRY.COUNT='+'||AREANAM
  482.          End
  483.        End
  484.      End
  485.    End
  486.    Call Close('ATTACHFILE')
  487.  End
  488.  Else 'requestnotify TITLE "Error" PROMPT "Unable to ReOpen file 'TEMP2'"'
  489.  
  490. Return
  491.  
  492.       /*-----------------------------------------------------------
  493.                                 DETACH AREAS
  494.       -----------------------------------------------------------*/
  495.  
  496. detachareas:
  497.  
  498. 'requestresponse TITLE "Detach Method" PROMPT "You may select areas in one of 2 ways" GADGETS "_AreaList|_Manually|_Cancel" CENTER'
  499.  If RC=0 Then Return
  500.  DETACHCommand=RC
  501.  
  502.  If DETACHCommand=1 Then Do
  503.    Do Forever
  504.     'requestarea TITLE "Select area to detach" ALL'
  505.      If RC>0 Then Return
  506.     'gotoarea' RESULT
  507.     'getareaname'
  508.      AREANAM=RESULT
  509.      If (left(AREANAM,3)='NET') Then Do
  510.       'requestresponse TITLE "Hmmmm..." PROMPT "Are you sure you want'LF'to detach a NETMAIL area?" GADGETS "_No!|_Yes" CENTER'
  511.        If RC=0 Then Leave
  512.      End
  513.      Else Leave
  514.    End
  515.    Dup=0
  516.    Do c=1 To COUNT
  517.      If ENTRY.c='-'AREANAM Then Dup=1
  518.    End
  519.    If Dup=0 Then Do Forever
  520.     'requestresponse TITLE "Announce" PROMPT "Announce your departure?" GADGETS "_Yes|_No|_Help|_Cancel" CENTER'
  521.      If RC=0 Then Leave
  522.      If RC=3 Then Call help(3)
  523.      Else Do
  524.        ANNOUNCE=RC
  525.        COUNT=COUNT+1
  526.        ENTRY.COUNT='-'||Upper(AREANAM)
  527.        If ANNOUNCE=1 Then Do
  528.          If Exists(DETACH_FILE) Then Do
  529.           'gotoarea' AREANAM
  530.           'messages'
  531.           'write TO "ALL" SUBJECT "'DETACH_SUBJECT'" ORIGIN "AFManager v1.1" FILE "'DETACH_FILE'"'
  532.            If RC>0 Then 'requestnotify TITLE "Error" PROMPT "Unable to write farewell message."'
  533.          End
  534.          Else 'requestnotify TITLE "Error" PROMPT "Unable to open announce file:'LF||DETACH_FILE'."'
  535.        End
  536.        Leave
  537.      End
  538.    End
  539.    Return
  540.  End
  541.  
  542. If DETACHCommand=2 Then Do
  543.   Do Forever
  544.    'requeststring TITLE "Manual detach" PROMPT "Enter area name to detach,'LF'Cancel to End." CENTER'
  545.     If RC>0 Then Leave
  546.     AREANAM=RESULT
  547.     Tmp=checkareaname()
  548.     If Tmp>0 Then Leave
  549.     Dup=0
  550.     Do c=1 To COUNT
  551.       If ENTRY.c='-'AREANAM Then Dup=1
  552.     End
  553.     If Dup=0 Then Do
  554.       COUNT=COUNT+1
  555.       ENTRY.COUNT='-'||AREANAM
  556.       If COUNT=MAXACTION Then Return
  557.     End
  558.   End
  559.   Return
  560. End
  561.  
  562. Return
  563.  
  564.       /*-----------------------------------------------------------
  565.                               CHECK AREANAME
  566.       -----------------------------------------------------------*/
  567.  
  568. checkareaname: PROCEDURE EXPOSE AREANAM LF
  569.  
  570. /* Remove unusual/invalid chars, like quotes or at@ signs */
  571.    BADCHAR=' @^,;:="'||"'"||"`" 
  572.    AREANAM=Compress(AREANAM,BADCHAR)
  573.  
  574. /* Remove leading +/- action character if user entered one by himself */
  575.    AREANAM=Strip(Strip(AREANAM,'L','+'),'L','-')
  576.  
  577. /* Remove leading/trailing "." from UUCP names and UPPER */
  578.    AREANAM=Upper(Strip(AREANAM,'B','.'))
  579.  
  580.    If Length(AREANAM)=0 Then Return '1'
  581.    If Length(AREANAM)>30 Then Do
  582.      message = 'LongName: '||Left(AREANAM,30)||'...'||LF||LF
  583.      message = message||'Some systems limit the length of Areanames'||LF
  584.      message = message||'to 30 chars or so. Proceed with operation?'
  585.     'requestresponse TITLE "LongName" PROMPT "'message'" GADGETS "_Proceed|_Cancel" CENTER'
  586.      If RC=0 Then Return '1'
  587.      End
  588.  
  589. Return '0'
  590.  
  591.       /*-----------------------------------------------------------
  592.                                ERASE ACTION
  593.       -----------------------------------------------------------*/
  594.  
  595. eraseaction:
  596.  
  597. Do Forever
  598.  
  599.   TEXT='Enter action number to erase:'||LF||LF
  600.  
  601.   If COUNT>0 Then Do c=1 To (COUNT-1)
  602.     If LENGTH(ENTRY.c)>30 Then TEXT2=Left(ENTRY.c,30)'...'
  603.       Else TEXT2=ENTRY.c
  604.     If c<10 Then TEXT=TEXT||'   (0'c')   '||TEXT2||LF
  605.       Else TEXT=TEXT||'   ('c')   '||TEXT2||LF
  606.   End
  607.   If LENGTH(ENTRY.COUNT)>30 Then TEXT2=Left(ENTRY.COUNT,30)'...'
  608.     Else TEXT2=ENTRY.COUNT
  609.   If COUNT<10 Then TEXT=TEXT||'   (0'COUNT')   '||TEXT2
  610.     Else TEXT=TEXT||'   ('COUNT')   '||TEXT2
  611.  
  612.  'requestnumber TITLE "Erase action" PROMPT "'TEXT'"'
  613.   If RC>0 Then Return
  614.  
  615.   AREANUM=RESULT
  616.   IF AREANUM=0 Then Return
  617.  
  618.   If AREANUM<COUNT Then Do c=AREANUM To COUNT
  619.     d=c+1
  620.     ENTRY.c=ENTRY.d
  621.   End
  622.   If AREANUM<=COUNT Then COUNT=COUNT-1
  623.   If COUNT=0 Then Return
  624.  
  625. End
  626.  
  627. Return
  628.  
  629.       /*-----------------------------------------------------------
  630.                                 WE ARE DONE
  631.       -----------------------------------------------------------*/
  632.  
  633. wearedone:
  634.  
  635. TEMPPASS=PASS
  636. If ~Open('AFMMESSAGE',TEMP,'w') Then Do
  637.  'requestnotify TITLE "Error" PROMPT "FATAL ERROR!'LF'Could not open temporary file ('TEMP')"'
  638.   Exit 10
  639. End
  640.  
  641. If COUNT>0 Then Do c=1 TO COUNT
  642.   Call WriteLn('AFMMESSAGE',ENTRY.c)
  643.   End
  644.  
  645.  Option=0
  646. 'requestresponse TITLE "Special options" PROMPT "Send a special option to Areafix?" GADGETS "_No|%%_LIST|%%_HELP|%%_QUERY|%%_Other|_Password"'
  647.  SpecialOption=RC
  648.  Select
  649.    When SpecialOption=2 Then Do
  650.      Call WriteLn('AFMMESSAGE','%LIST')
  651.      Option=1
  652.      End
  653.    When SpecialOption=3 Then Do
  654.      Call WriteLn('AFMMESSAGE','%HELP')
  655.      Option=1
  656.      End
  657.    When SpecialOption=4 Then Do
  658.      Call WriteLn('AFMMESSAGE','%QUERY')
  659.      Option=1
  660.      End
  661.    When SpecialOption=5 Then Do
  662.     'requeststring TITLE "Other options" PROMPT "Enter the special command you wish to send" CENTER'
  663.      If RC=0 Then Do
  664.        Tmp=Strip(RESULT,'L','%')
  665.        Tmp=Word(Tmp,1)
  666.        Tmp="%"Upper(Tmp)
  667.        If Length(Tmp)>1 Then Do
  668.          Call WriteLn('AFMMESSAGE',Tmp)
  669.          Option=1
  670.          End
  671.        End
  672.      End
  673.    When SpecialOption=0 Then Do
  674.     'requeststring TITLE "Password options" PROMPT "Add options to the password'Lf'eg. -L -H" DEFAULT "'PASS'" CENTER'
  675.      If RC=0 Then Do
  676.        Tmp=RESULT
  677.        If (Length(Tmp)>0)&(Length(Tmp)>Length(PASS)) Then Do
  678.          PASS=Tmp
  679.          Option=1
  680.          End
  681.        End
  682.      End
  683.    Otherwise NOP
  684.  End
  685.  
  686. If (COUNT>0)|(Option=1) Then Do /* do we have something to ask areafix? */
  687.  
  688. /*Call WriteLn('AFMMESSAGE','')                   */
  689. /*Call WriteLn('AFMMESSAGE',"--- AFManager v1.4") */
  690.  
  691.   Call Close('AFMMESSAGE')
  692.  'gotoarea' REAL_NAME
  693.  'messages'
  694.  'write TO "'AREAFIX'" TOADDR "'ADDRESS'" SUBJECT "'PASS'" FILE "'TEMP'" REFLOW=OFF NOSIG NOEDIT NOGUI'
  695.   If RC>0 Then Do
  696.    'requestnotify PROMPT "FATAL ERROR!'LF'Could not write message to areafix!"'
  697.     Exit 10
  698.     End
  699.  'lastmessage'
  700.   End
  701. Else Call Close('AFMMESSAGE')
  702.  
  703. Address COMMAND
  704.  'Delete >NIL: 'TEMP
  705.  'Delete >NIL: 'TEMP2
  706.  
  707. Exit
  708.  
  709.       /*-----------------------------------------------------------
  710.                                     HELP
  711.       -----------------------------------------------------------*/
  712.  
  713. help:
  714. ARG helpindex
  715. If helpindex<(helpitems+1) Then 'requestnotify TITLE "Help" PROMPT "'helpmsg.helpindex'"'
  716. Else Do
  717.   say '+++ Error! Unavailable help for index 'helpindex
  718.   Exit 10
  719. End
  720. Return
  721.  
  722.       /*-----------------------------------------------------------
  723.                                ERROR HANDLERS
  724.       -----------------------------------------------------------*/
  725.  
  726. BREAK_C:
  727. say "+++ Break!"
  728. Exit 10
  729. SYNTAX:
  730. say "+++ Syntax Error ("RC") at line "SIGL" : "errortext(RC)
  731. Exit 10
  732. NOVALUE:
  733. say "+++ No Value Error at line "SIGL
  734. Exit 10
  735. FAILURE:
  736. Say "+++ Failure! Something's fishy at line "SIGL
  737. Exit 10
  738.